package com.bicon.botu.core.base.config;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 定时任务AOP，集群情况下选举一个服务进行执行任务
 * @author tandk
 * @date 2018/3/1 16:18
 */
@Slf4j
@Aspect
@Component
public class ScheduledAspect {

    /**
     * 服务端口号
     */
    @Value("${server.port}")
    String serverPort;

    /**
     * 服务名
     */
    @Value("${spring.application.name}")
    String appName;

    @Around("execution(public * *..processor.task.schedule.*.*(..))")
    public void doAround(ProceedingJoinPoint pjp) throws Throwable {
        long startTime = System.currentTimeMillis();
        /**
         * 集群情况下，为了避免重复执行任务，只能选取一个服务执行，集群中服务端口号规则都是从3xxx0开始，所以选取第一个服务执行任务
         */
        String portEndStr = "0";
        if(serverPort.endsWith(portEndStr)){
            Object result = pjp.proceed();
            log.info("[定时任务][{}][{}]执行完成，执行时间[{}]，执行结果【{}】", pjp.getTarget().getClass(), pjp.getSignature().getName(), System.currentTimeMillis()-startTime, String.valueOf(result));
        }
    }

}